TIP Sample App/AppDelegate.m (154 lines of code) (raw):
//
// AppDelegate.m
// TIP Sample App
//
// Created on 2/3/17.
// Copyright © 2020 Twitter. All rights reserved.
//
#import <TwitterImagePipeline/TwitterImagePipeline.h>
#import "AppDelegate.h"
#import "InspectorViewController.h"
#import "SettingsViewController.h"
#import "TIPXWebPCodec.h"
#import "TwitterAPI.h"
#import "TwitterSearchViewController.h"
@interface AppDelegate () <TIPLogger, TIPImagePipelineObserver, TwitterAPIDelegate, TIPImageAdditionalCache>
{
NSInteger _opCount;
}
@end
@implementation AppDelegate
- (BOOL)isDebugInfoVisible
{
return [TIPImageViewFetchHelper isDebugInfoVisible];
}
- (void)setDebugInfoVisible:(BOOL)debugInfoVisible
{
[TIPImageViewFetchHelper setDebugInfoVisible:debugInfoVisible];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[TIPGlobalConfiguration sharedInstance].logger = self;
[TIPGlobalConfiguration sharedInstance].serializeCGContextAccess = YES;
[TIPGlobalConfiguration sharedInstance].clearMemoryCachesOnApplicationBackgroundEnabled = YES;
[[TIPGlobalConfiguration sharedInstance] addImagePipelineObserver:self];
[[TIPImageCodecCatalogue sharedInstance] setCodec:[[TIPXWebPCodec alloc] initWithPreferredCodec:nil] forImageType:TIPImageTypeWEBP];
_imagePipeline = [[TIPImagePipeline alloc] initWithIdentifier:@"Twitter.Example"];
_imagePipeline.additionalCaches = @[self];
[TwitterAPI sharedInstance].delegate = self;
_searchCount = 100;
UIColor *lightBlueColor = [UIColor colorWithRed:(CGFloat)(150./255.) green:(CGFloat)(215./255.) blue:1 alpha:0];
[UISearchBar appearance].barTintColor = lightBlueColor;
[UISearchBar appearance].tintColor = [UIColor whiteColor];
[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]].tintColor = lightBlueColor;
[UINavigationBar appearance].barTintColor = lightBlueColor;
[UINavigationBar appearance].tintColor = [UIColor whiteColor];
[[UINavigationBar appearance] setTitleTextAttributes:@{
NSForegroundColorAttributeName: [UIColor whiteColor]
}];
[UITabBar appearance].barTintColor = lightBlueColor;
[UITabBar appearance].tintColor = [UIColor whiteColor];
[UISlider appearance].minimumTrackTintColor = lightBlueColor;
[UISlider appearance].tintColor = lightBlueColor;
[UIWindow appearance].tintColor = lightBlueColor;
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UINavigationController *firstNavController = [[UINavigationController alloc] initWithRootViewController:[[TwitterSearchViewController alloc] init]];
firstNavController.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Search" image:[UIImage imageNamed:@"first"] tag:1];
UINavigationController *secondNavController = [[UINavigationController alloc] initWithRootViewController:[[SettingsViewController alloc] init]];
secondNavController.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Settings" image:[UIImage imageNamed:@"second"] tag:2];
UINavigationController *thirdNavController = [[UINavigationController alloc] initWithRootViewController:[[InspectorViewController alloc] init]];
thirdNavController.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Inspector" image:[UIImage imageNamed:@"first"] tag:3];
self.tabBarController = [[UITabBarController alloc] init];
self.tabBarController.viewControllers = @[ firstNavController,
secondNavController,
thirdNavController ];
self.window.rootViewController = self.tabBarController;
self.window.backgroundColor = [UIColor orangeColor];
[self.window makeKeyAndVisible];
return YES;
}
- (void)_private_incrementNetworkOperations
{
if ((++_opCount) > 0) {
#if !TARGET_OS_MACCATALYST
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
#endif
}
}
- (void)_private_decrementNetworkOperations
{
if ((--_opCount) <= 0) {
#if !TARGET_OS_MACCATALYST
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
#endif
}
}
- (void)incrementNetworkOperations
{
if ([NSThread isMainThread]) {
[self _private_incrementNetworkOperations];
} else {
[self performSelectorOnMainThread:@selector(_private_incrementNetworkOperations) withObject:nil waitUntilDone:NO];
}
}
- (void)decrementNetworkOperations
{
if ([NSThread isMainThread]) {
[self _private_decrementNetworkOperations];
} else {
[self performSelectorOnMainThread:@selector(_private_decrementNetworkOperations) withObject:nil waitUntilDone:NO];
}
}
#pragma mark API Delegate
- (void)APIWorkStarted:(TwitterAPI *)api
{
[self incrementNetworkOperations];
}
- (void)APIWorkFinished:(TwitterAPI *)api
{
[self decrementNetworkOperations];
}
#pragma mark Observer
- (void)tip_imageFetchOperation:(TIPImageFetchOperation *)op didStartDownloadingImageAtURL:(NSURL *)URL
{
[self incrementNetworkOperations];
}
- (void)tip_imageFetchOperation:(TIPImageFetchOperation *)op didFinishDownloadingImageAtURL:(NSURL *)URL imageType:(NSString *)type sizeInBytes:(NSUInteger)byteSize dimensions:(CGSize)dimensions wasResumed:(BOOL)wasResumed
{
[self decrementNetworkOperations];
}
#pragma mark Logger
- (void)tip_logWithLevel:(TIPLogLevel)level file:(NSString *)file function:(NSString *)function line:(int)line message:(NSString *)message
{
NSString *levelString = nil;
switch (level) {
case TIPLogLevelEmergency:
case TIPLogLevelAlert:
case TIPLogLevelCritical:
case TIPLogLevelError:
levelString = @"ERR";
break;
case TIPLogLevelWarning:
levelString = @"WRN";
break;
case TIPLogLevelNotice:
case TIPLogLevelInformation:
levelString = @"INF";
break;
case TIPLogLevelDebug:
levelString = @"DBG";
break;
}
NSLog(@"[%@]: %@", levelString, message);
}
#pragma mark Additional Cache
- (void)tip_retrieveImageForURL:(NSURL *)URL completion:(TIPImageAdditionalCacheFetchCompletion)completion
{
UIImage *image = nil;
if ([URL.scheme isEqualToString:@"placeholder"]) {
if ([URL.host isEqualToString:@"placeholder.com"]) {
if ([URL.lastPathComponent isEqualToString:@"placeholder.jpg"]) {
static UIImage *placeholderImage = nil;
if (!placeholderImage) {
placeholderImage = [UIImage imageNamed:@"placeholder.jpg"];
}
image = placeholderImage;
}
}
}
completion(image);
}
@end